package com.qkjia.channel;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

/**
 * 服务器socket连接通道
 */
public class ServerSocketChannelDemo {

    public static void main(String[] args) throws Exception {
        // 端口号
        int port = 8888;

        // buffer
        // ByteBuffer.wrap 将字节数组包装到缓冲区中。
        ByteBuffer buffer = ByteBuffer.wrap("hello qkjia".getBytes());

        // ServerSocketChannel 面向流的侦听套接字的可选通道。 ServerSocketChannel.open(); 打开一个服务器套接字通道。
        ServerSocketChannel ssc = ServerSocketChannel.open();
        // 绑定 socket( 检索与此通道关联的服务器套接字。 参数：
        // .bind 端点 – 要绑定到的 IP 地址和端口号。
        ssc.socket().bind(new InetSocketAddress(port));

        // 设置非阻塞模式
        // 通过以上方法设置 SocketChannel 的读写模式。false 表示非阻塞，true 表示阻塞。
        ssc.configureBlocking(false);

        // 监听有新链接传入
        while(true) {
            System.out.println("Waiting for connections");
            // 接受与此通道的套接字建立的连接。
            SocketChannel sc = ssc.accept();
            if(sc == null) { //没有链接传入
                System.out.println("null");
                Thread.sleep(2000);
            } else {
                System.out.println("Incoming connection from: " + sc.socket().getRemoteSocketAddress());
                buffer.rewind(); //指针0
                sc.write(buffer);
                sc.close();
            }
        }
    }
}
